package it.poste.il.compensatore.aop;

import java.util.Arrays;
import java.util.Date;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LogAspect {
		
	/*
	 * Applicato ad ogni metodo in seguito al rilancio di un eccezione
	 */
	@AfterThrowing("execution(* *.*(..))")
	public void afterThrowing(JoinPoint jp) throws Throwable {
		System.err.println("\tErrore: " + jp.getSignature().getName());
	}
	
	/*
	 * Applicato prima dell'esecuzione dei metodi pubblici delle classi contenute 
	 * nel package it.html.spring.book ed aventi nel nome la parola Dao
	 */
	@Before("execution(public * it.poste.il.compensatore.dao.*Dao.*(..))")
	public void beforeAdvice(JoinPoint jp) {
		// Log prima dell'invocazione del metodo
		System.out.println("[" + new Date() + "]\n\t" 
				+  jp.getTarget().getClass() + "."  +  jp.getSignature().getName()
				+  "\n\tArgomenti: "+ Arrays.toString(jp.getArgs()));	
	}
	
	/*
	 * Applicato dopo l'esecuzione dei metodi pubblici delle classi contenute 
	 * in tutti i package della gerarchia it ed aventi nel nome la parola Dao
	 */	
	@AfterReturning(
			pointcut = "execution(public * it..*Dao.*(..))",
			returning = "returnValue")
	public void afterReturning(JoinPoint jp, Object returnValue) throws Throwable {
		// Log del risultato dell'invocazione del metodo
		System.out.println("\tRisultato: "+ returnValue);	
	}	
	
}
